namespace Framework.FluentTextStringBuilder
{
    public interface ITextStringBuilderConfigurationFluent
    {
        /// <summary>
        /// Changes context to the fluent writer.
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderWriterFluent Writer();

        // *********************************************************************************
        // Set Configuation Values
        // *********************************************************************************

        /// <summary>
        /// Sets the indent position.
        /// </summary>
        /// <param name="indentPosition">The indent position.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetIndent(int indentPosition);

        /// <summary>
        /// Sets the indent text (Defaults to "    ").
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetIndentText();

        /// <summary>
        /// Sets the indent text.
        /// </summary>
        /// <param name="indentText">The indent text.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetIndentText(string indentText);

        /// <summary>
        /// Enclosures have indentation (Before/After).
        /// </summary>
        /// <param name="isIndent">if set to <c>true</c> [is indent].</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetEnclosureHasIndentation(bool isIndent);

        /// <summary>
        /// Enclosures write a new line (Before/After).
        /// </summary>
        /// <param name="isNewLine">if set to <c>true</c> [is new line].</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetEnclosureHasNewLine(bool isNewLine);

        /// <summary>
        /// Sets the text to use when adding a new line (Default is Carriage Return/Line Feed).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNewLine();

        /// <summary>
        /// Sets the text to use when adding a new line.
        /// </summary>
        /// <param name="newLine">The new line.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNewLine(string newLine);

        /// <summary>
        /// Sets the name value seperator (Uses default seperator).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNameValueSeperator();

        /// <summary>
        /// Sets the name value seperator.
        /// </summary>
        /// <param name="seperator">The seperator.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNameValueSeperator(string seperator);

        /// <summary>
        /// Sets the name value padding (Uses default padding size).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNameValuePadding();

        /// <summary>
        /// Sets the name value padding.
        /// </summary>
        /// <param name="padding">The padding.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetNameValuePadding(int padding);

        /// <summary>
        /// Sets the divider character (Uses default character).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetDividerCharacter();

        /// <summary>
        /// Sets the divider character.
        /// </summary>
        /// <param name="dividerCharacter">The divider character.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetDividerCharacter(char dividerCharacter);

        /// <summary>
        /// Sets the length of the divider (Uses default character).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetDividerLength();
 
        /// <summary>
        /// Sets the length of the divider.
        /// </summary>
        /// <param name="dividerlength">The divider length.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetDividerLength(int dividerlength);

        /// <summary>
        /// Sets the template property delimiter used when replacing delimited property names in a template (Uses default character).
        /// </summary>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetTemplatePropertyDelimiter();

        /// <summary>
        /// Sets the template property delimiter used when replacing delimited property names in a template.
        /// </summary>
        /// <param name="propertyDelimiter">The property delimiter.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent SetTemplatePropertyDelimiter(ReplacePropertyDelimiterType propertyDelimiter);

        /// <summary>
        /// Set Data object with a typesafe Key/Value
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">The key.</param>
        /// <param name="value">The value.</param>
        /// <returns></returns>
        ITextStringBuilderConfigurationFluent DataSet<T>(string key, T value);
    }
}
